package cn.tedu.csmall.business.service.impl; 
 /*
 @Time: 2022/11/12 16:19
 @Author:GShuai
 @File:BusinessServiceImpl.class
 @Software:IntelliJ IDEA
*/

import cn.tedu.csmall.business.service.IBusinessService;
import cn.tedu.csmall.commons.exception.CoolSharkServiceException;
import cn.tedu.csmall.commons.pojo.order.dto.OrderAddDTO;
import cn.tedu.csmall.commons.restful.ResponseCode;
import cn.tedu.csmall.order.service.IOrderService;
import io.seata.spring.annotation.GlobalTransactional;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.stereotype.Service;

@Service
@Slf4j
public class BusinessServiceImpl implements IBusinessService {
    // Dubbo调用order模块中生成订单的方法
    @DubboReference
    private IOrderService dubboOrderService;

    // 一旦编写@GlobalTransactional  注解标记这个方法
    // 这个方法就是seata分布式事务的起点了，也就是TM
    // 最终的效果就是由当前方法引发的所有远程调用对数据库的操作，要么都成功要么都失败
    @GlobalTransactional
    @Override
    public void buy() {
        // 模拟购买业务
        // 创建一个OrderAddDTO类，并为他赋值
        OrderAddDTO orderAddDTO = new OrderAddDTO();
        orderAddDTO.setUserId("UU100");
        orderAddDTO.setCommodityCode("PC100");
        orderAddDTO.setCount(5);
        orderAddDTO.setMoney(500);
        // 模拟只输出到控制台
        log.info("新增订单的信息为：{}", orderAddDTO);
        // Dubbo 调用业务
        dubboOrderService.orderAdd(orderAddDTO);
        // 为了验证seata实现的分布式事务效果
        // 我们在所有代码运行完毕之后,随机抛出异常观察是否能够回滚
        if(Math.random()<0.5){
            throw  new CoolSharkServiceException(
                    ResponseCode.INTERNAL_SERVER_ERROR,"发生随机异常，本次操作回滚！");
        }
    }
}
